#!/usr/bin/env python
#-*- coding:utf-8 -*-

from __future__ import print_function
import re
import datetime
import sys

class Tarea (object):
	NOERROR = 0
	ERROR = 1

	def __init__(self, nombre, entrada = None, noLeer = None, salida = None, log = None, errores = None):
		# Nombre de la tarea.
		self.nombre = nombre
		# Objeto archivo de entrada.
		self.entrada = entrada
		# Numero de registro del archivo de entrada que se deben obviar.
		self.noLeer = noLeer
		# Objeto archivo de salida.
		self.salida = salida
		# Objeto de informe de actividades.
		self.log = log
		# Objeto de informe de registros de errores.
		self.errores = errores

	def configurar(self, entrada, noLeer, salida, log, errores):
		self.entrada = entrada
		self.noLeer = noLeer
		self.salida = salida
		self.log = log
		self.errores = errores

	def _fileName(self, fileObject):
		name = None
		if (not fileObject is None):
			try:
				name = fileObject.name
			except:
				name = None
		return name

	def errorMessage(self, linea, nReg):
		aux = linea.replace('\n','\\n')
		aux = aux.replace('\t','\\t')
		msg = self.entradaNombre() + "[{0}]: '".format(nReg) + aux +"'." #+ re.escape(linea) + "'."
		return msg

	def entradaNombre(self):
		return self._fileName(self.entrada)

	def salidaNombre(self):
		return self._fileName(self.salida)
		
	def do(self):
		nReg = 0
		nErrores = 0
		linea = None
		try:
			for linea in self.entrada:
				nReg+= 1
				if not nReg in self.noLeer:
					error = self.process(linea,nReg)

					if (error == Tarea.NOERROR):
						pass #TODO
					else:
						nErrores+= 1
						self.errores.error( self.errorMessage(linea,nReg) )

			msg = "Se ha procesado con exito el archivo: '"+ self.entradaNombre() +"."
			self.log.info(msg)
		except Exception as e:
			self.log.info( e )
			# Errores por fuera de la tarea.
			if None != linea:
				self.errores.error( self.errorMessage(linea,nReg) )
			nErrores+= 1
			
		if (self.summarize() != Tarea.NOERROR):
			nErrores+= 1
			msg = " : error al sumarizar el archivo '"+ self.entradaNombre() +"'."
			self.log.error(msg)

		if (nErrores > 0):
			msg = " : " + str(nErrores) + " errores al procesar '"+ self.entradaNombre() +"'."
			self.log.error(msg)
		msg = "Se ha terminado de procesar el archivo: '"+ self.entradaNombre() +"."
		self.log.info(msg)

	# Cada tarea debe definir como se procesa una linea.
	def process(self,linea, nReg):
		return Tarea.ERROR

	# Calculos o proceso que se realiza una sola vez al finalizar de procesar todas las lineas
	def summarize(self):
		return Tarea.NOERROR

if __name__ == '__main__':
	pass

